from multiprocessing  import Process
import time
import socket
import threading
import os
def run1():run(6969)
def run2():run(6970)
def run3():run(6971)
#socket连接
def run(port):
    print("子进程开始>>pid={0},ppid={1}".format(os.getpid(), os.getppid()))
    time.sleep(2)
    # 创建tcp/ip协议的套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用，让程序推出端口号立即释放，否则的话在30秒-2分钟内这个端口不会被
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # host是服务器端的ip地址
    buffer_size = 1024;
    host='192.168.145.178'
    address = (host, port)
    print(address)
    # 绑定地址
    tcp_server.bind(address)
    # 设置监听
    # 5表示最大等待建立连接的个数
    tcp_server.listen(128)
    print("正在监听端口号为",port,"的端口")
    while True:
        tcp_client_1, tcp_client_addr = tcp_server.accept()
        print("已经连接到客户端，链接地址{0}".format(tcp_client_addr))
        # 创建多线程对象并执行报文拆解函数，根据报文的拆解进行响应函数的调用
        thd = threading.Thread(target=recv, args=(tcp_client_1, tcp_client_addr))
        print("开启新线程")
        # 启动子线程对象
        thd.start()
    # 对接收到的消息进行分析并执行响应函数

#接收消息
def recv(tcp_client_1,tcp_client_addr):
    while True:
        #当前时间节点
        client_text=tcp_client_1.recv(1024)
        #如果接收的长度不为0，解码输出
        if client_text:
            print("接收到客户端消息",tcp_client_addr,":",client_text.decode("utf-8"))
            #根据客户端消息进行响应函数的调用
            #给客户端相应
            fun2();
            tcp_client_1.send("收到\n".encode())
        #在一定时间内未发送活报文
        else:
            print("客户端",tcp_client_addr,"已下线")
            tcp_client_1.close()
            break
def fun2():
    print("正在执行功能2")
    return 2

if __name__=='__main__':
    c_pro=Process(target=run1)
    s_pro=Process(target=run2)
    d_pro=Process(target=run3)
    c_pro.start()
    s_pro.start()
    d_pro.start()
